package top.eggcode.common.lang;

import java.util.List;

/**
 * Title: 字符串工具
 * Description: TODO
 * Date: 2021/4/6 19:01
 *
 * @author JiaQi Ding
 * @version 1.0
 */
public class StringUtil {


    /**
     * 是否包含
     *
     * @param ps 字典数组
     * @param s  匹配值
     * @return 匹配结果
     */
    public static boolean isInclude(String[] ps, String s) {
        for (String p : ps) {
            if (isInclude(p, s)) {
                return true;
            }
        }
        return false;
    }

    /**
     * 是否包含
     * 实现算法：KMP
     *
     * @param p 主字符串
     * @param s 次字符串
     * @return 匹配结果
     */
    public static boolean isInclude(String p, String s) {
        int[] next = getKmpNextTable(s);
        for (int i = 0, j = 0; i < p.length(); i++) {
            while (j > 0 && p.charAt(i) != s.charAt(j)) {
                // 移动位数
                j = next[j - 1];
            }
            if (p.charAt(i) == s.charAt(j)) {
                j++;
            }
            if (j == s.length()) {
                // 完全匹配的开始位置
                //return i-j+1;
                return true;
            }
        }
        //return -1;
        return false;
    }


    /**
     * 获取 KMP 算法 next表
     *
     * @param s 字符串
     * @return next数组
     */
    private static int[] getKmpNextTable(String s) {
        int len = s.length();
        int[] next = new int[len];
        char[] p = s.toCharArray();
        next[0] = 0;
        int k = 0;
        int i = 1;
        while (i < len) {
            // 没有相等，则 k 置为0
            while (k > 0 && p[k] != p[i]) {
                k = next[k - 1];
            }
            // 前后相等
            if (p[k] == p[i]) {
                k++;
            }
            next[i] = k;
            i++;
        }
        return next;
    }

    public String join(List<String> elements, String character) {
        //StringUtils.join
        return null;
    }

}
